#include "nameCaller.h"
nameCaller::nameCaller(QObject *parent)   // todo:这里添加开始接受按键
    : QObject(parent)
{
    switchTime = new QTimer(this);
    switchTime->setInterval(33);  // 初始化时设置间隔以防止出错
    switchTime->setSingleShot(false);  // 需要定时器重复触发

    connect(switchTime,SIGNAL(timeout()),this,SLOT(timeOutCall()));

    QTime time = QTime::currentTime();  //获得当前时间
    nameRandomGen.seed(time.msec()+time.second()*10000);

    nameInValidRule = QRegularExpression(nameInValidStr);  // 编译不合规文件名字符匹配表达式
}

nameCaller::~nameCaller()
{  // 析构函数
    delete switchTime;
}

void nameCaller::clear(){
    // 停止点名，清空数据
    if (doingCall){
        switchTime->stop();
        doingCall = false;
    }
    emit callName("");
    strListImport.clear();
    selectNameIndex = 0;
}

void nameCaller::callOnceCheck(int checkState){
    // 根据点名一次勾选框响应
    switch(checkState){
    case Qt::Unchecked:
        callOnce = false;
        break;
    case Qt::PartiallyChecked:
        break;
    case Qt::Checked:
        callOnce = true;
        break;
    default:
        callOnce = false;
        break;
    }
}

void nameCaller::processFile(QString filePath){
    // 首先要先清空
    clear();

    //获取文件路径
    QDir QFilePath = QDir(filePath);
    QFile fileReader(filePath);
    QByteArray fileBytes;
    QString fileName = QFilePath.dirName();  // 记录文件名
    QString fileLine;

    if ((fileName.mid((fileName.size()-3),3).toLower())==QString("txt")){
        // 为txt文件，尝试读取
        try{
            if (fileReader.open(QIODevice::ReadOnly)){
                fileBytes = fileReader.readAll();
                fileReader.close();
                {
                    uchardet_t ud = uchardet_new();
                    uchardet_handle_data(ud, fileBytes.data(), fileBytes.size());
                    uchardet_data_end(ud);
                    const char* cs = uchardet_get_charset(ud);
                    uchardet_delete(ud);
                    qDebug()<<"编码方式: "<<cs;
                }
                QTextStream fileTexts(fileBytes,QIODevice::ReadOnly);
                while (!fileTexts.atEnd()){
                    fileLine.clear();
                    fileLine = fileTexts.readLine();
                    fileLine.replace(nameInValidRule,"");
                    if (fileLine.size() <= 0){
                        qDebug()<<"有一行没有字符";
                    }
                    else{
                        if (fileLine.size() >= 5){
                            qDebug()<<"有一行过长";
                        }
                        else{
                            strListImport.append(fileLine);
                        }
                    }
                }
//                fileReader.close();  // 打开成功才关闭
                if (strListImport.length() > 0){
                    emit fileReadResult(false, QString("您已成功导入%1个名字！").arg(strListImport.length()));
                }
                else{
                    clear();
                    emit fileReadResult(true);
                }
            }
            else{
                clear();
                emit fileReadResult(true);
            }
        }
        catch(...){
            clear();
            emit fileReadResult(true);
        }
    }
}

void nameCaller::doCall(){
    if (doingCall){
        switchTime->stop();
        doingCall = false;
        if ((callOnce) && (selectNameIndex >= 0)){
            strListImport.removeAt(selectNameIndex);
        }
        if (strListImport.length() <= 0){
            emit callOver();
            clear();
        }
    }
    else{
        if (strListImport.length() > 0){
            doingCall = true;
            switchTime->start();
        }
        else{
            emit callOver();
            clear();
        }
    }
}

void nameCaller::timeOutCall(){
    selectNameIndex = nameRandomGen.bounded(strListImport.length());   //初始化随机数
    emit callName(strListImport.at(selectNameIndex));
}
